
#ifndef __SSPROTO_NAME_HASH_H
#define __SSPROTO_NAME_HASH_H 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

namespace qb{
namespace proto{

class hash_table {
public:
    typedef struct __st_node{
        size_t code ;       //哈希值
        size_t value ;      //节点值
    } node ;


    hash_table() ;
    ~hash_table() ;

    bool insert(size_t code , size_t value) ;
    bool remove(size_t code) ;
    bool find(size_t code , size_t& value) const ;
    bool update(size_t code , size_t value) ;
    void clear() ;

    inline size_t count() const {return count_ ;}
    inline size_t size() const {return size_ ;}

    static size_t hash_value(const char * str , size_t size) ;
    static size_t apr_hash_value(const char * str , size_t size) ;
    static size_t murmur_hash_value(const char * str , size_t size) ;

    size_t next_size() ;

    //static size_t get_prime(int idx) ;
private:
    node * nodes_ ;
    size_t count_ ;          //nodes节点的有效值
    size_t size_ ;           //nodes节点的最大值
    //int prime_idx_ ;

    bool extend() ;
} ;

}
}

#endif  /** __SSPROTO_NAME_HASH_H */
